package com.net.io.netty.emebededchannel;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.embedded.EmbeddedChannel;

import java.util.Objects;

/**
 * 入站消息测试
 *
 * @author zhangtengfei
 * @date 2022/2/17 11:37
 */

public class FixedLengthFrameDecoderTest {
    /**
     * 一 、测试入站
     * <p>
     * 给定足够的数据，这个实现将产生固定大小的帧。如果没有足够的数据可供读取，它将等待下一个数据块的到来，并将再次检查是否能够产生一个新的帧。
     * 这个特定的解码器将产生固定为 3 字节大小的帧。因此，它可能会需要多个事件来提供足够的字节数以产生一个帧。
     */
    public void testFramesDecoded() {
        // 创建一个 ByteBuf，并存储 9 字节
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 9; i++) {
            buf.writeByte(i);
        }
        ByteBuf input = buf.duplicate();

        EmbeddedChannel channel = new EmbeddedChannel(new FixedLengthFrameDecoder(3));

        // 返回false
        System.out.println(channel.writeInbound(input.readBytes(1)));
        System.out.println(channel.writeInbound(input.readBytes(1)));
        System.out.println(channel.writeInbound(input.readBytes(1)));
        System.out.println(channel.writeInbound(input.readBytes(6)));

        channel.finish();

        // read messages
        // 读取所生成的消息，并且验证是否有 3 帧（切片），其中每帧（切片）都为 3 字节
        ByteBuf read = (ByteBuf) channel.readInbound();
        // 和源进行比对
        System.out.println(Objects.equals(buf.readSlice(3), read));
        read.release();

        read = (ByteBuf) channel.readInbound();
        System.out.println(Objects.equals(buf.readSlice(3), read));
        read.release();

        read = (ByteBuf) channel.readInbound();
        System.out.println(Objects.equals(buf.readSlice(3), read));
        read.release();

        System.out.println((channel.readInbound() == null));
        buf.release();
    }

}

